﻿// Inner Fire 游戏引擎库
// SkinMeshObject - 骨骼动画对象
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层（4）
// 用于配置一个SkinMesh的游戏对象
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-03-12

#pragma once

#include <dx/mesh/render_item.h>
#include <dx/mesh/skin_animator.h>
#include <game/object/game_object.h>
#include <game/resource/model.h>

namespace ifire::game {
class SkinMeshObject : public GameObject {
public:
  SkinMeshObject(ikit::sstr name, Scene* scene, GameObject* parent = nullptr);
  SkinMeshObject(const SkinMeshObject& lhs) = delete;
  SkinMeshObject& operator=(const SkinMeshObject& lhs) = delete;
  ~SkinMeshObject() override;

  // 覆盖
  void FixedUpdate() override;
  // 加入一个子对象
  void AddRenderItem(dx::RenderItem* item);
  // 返回此对象的骨架。如果没有，则返回nullptr
  Armature* GetArmature() override;
  // 返回蒙皮骨骼的Animator，如果没有，则返回nullptr
  dx::SkinAnimator* GetSkinAnimator() override;

  // 打印信息
  void PrintInfo(ikit::sstr info_type) override;
  // 更新Transform
  void UpdateTransform() override;
  // 直接设置最终的变换矩阵
  void SetRenderMatrix(FMat mat) override;

  //
  // 属性访问
  //
  inline void SetModel(Model* model) { model_ = model; }
  inline Model* GetModel() const { return model_; }
  void SetAnimator(dx::SkinAnimator* value) { animator_ = value; }
  inline dx::SkinAnimator* GetAnimator() const { return animator_; }
  eastl::vector<dx::RenderItem*>& RenderItems() { return render_items_; }

private:
  // 此项目对应的模型
  Model* model_;
  // 此项目的动画机
  dx::SkinAnimator* animator_;
  // 此项目的渲染对象
  eastl::vector<dx::RenderItem*> render_items_;
};

} // namespace ifire::game